home *** CD-ROM | disk | FTP | other *** search
- ///////////////////////////////////////////////////////////////
- //
- // Module : QBPROCS.PRG
- //
- // Created by SUMMER'93 (c) on Fri Nov 26 14:49:59 1993
- //
- ///////////////////////////////////////////////////////////////
- #include "snj.ch"
- // The following statics were declared 'PUBLIC' in the S87 code
- // OR were private and inherited by called functions
- // If they are used outside this module there will be a set/get
- // function with the same name as the var in this module
- static PAGENO, PHEAD, PFOOT, PSTART, PDEST, LSTSUN
- procedure QBMESS( MSG, COLPARAM, WAITIME ) // Amended by SUMMER93
- // Calls:
- // Called By: BODINDEX INVEDIT INVDEL INVREN QB2DATES QBMENU QBPRCTL QBADBLNK INVOUT QBTXTMAC QBINDATE BODARCH BODREST REPARAM INVVEH INVPAY INVINSLB NEWNUM
- // Q B M E S S . P R G
- // Print a MSG and wait for key stroke
- local MEM, GETLIST
- GETLIST := {}
-
- // Last change: MIB 11 Aug 93 4:40 pm
-
- do case
- case pcount( ) = 0
- MSG := "Press any key to continue..."
- COLPARAM := COLMENU()
- WAITIME := - 1
- case pcount( ) = 1
- COLPARAM := COLNORM()
- WAITIME := 0
- case pcount( ) = 2
- WAITIME := 0
- endcase
-
- @ QBMSGLIN() , 0 clear to QBMSGLIN() + 1, 79
- set color to( COLPARAM )
- @ QBMSGLIN() , centre( trim(MSG ), 79 )say trim( MSG )
- set color to( COLNORM() )
- do case
- case WAITIME > 0
- inkey( WAITIME )
- @ QBMSGLIN() , 0 clear to QBMSGLIN() + 1, 79
- case WAITIME < 0
- set cursor off
- MEM := " "
- set color to( COLPWD() )
- @ QBMSGLIN() , 0 get MEM
- read
- set color to( COLNORM() )
- @ QBMSGLIN() , 0 clear to QBMSGLIN() + 1, 79
- set cursor on
- endcase
-
- return
-
- //*****************************************************************
-
- procedure QBCLMESS
- // Calls:
- // Called By: BODINDEX INVREN QBPROMPT QBREAD QBPRCTL QBGETD QBYESNO PARTPRMT QBDBCTRL BODARCH CTPRMT1 CTPRMT2
- // Q B C L M E S S
- // Clear the message box
-
- set color to( COLNORM() )
- @ QBMSGLIN() , 0 clear to QBMSGLIN() + 1, 79
-
- return
-
- //*****************************************************************
-
- function QBPROMPT( CMDS, MSG, CMDNO ) // Amended by SUMMER93
- // Calls: CHRCOUNT QBCLMESS ATNEXT
- // Called By: INVMAIN INVEDIT INVADD QBPRCTL INVOUT QBPSETUP PARTUPDAT QBDBCTRL QBDBEXIT DRIVEOK REPMAIN REPARAM GINVNO CTUPDATE
-
- // Q B P R O M P T . P R G
- // Prompt user for single letter command
-
- // The following locals have been declared by Summer'93
- // N1 N2
- local NCMDS, COLNO, I, MCHR, N1, N2
-
- N1 := 1
- set message to QBMSGLIN() + 1 center
- if pcount( ) = 1
- MSG := "Select with first character, or " + chr( 27 ) + " " + chr( 26 ) + ;
- " and ┘"
- elseif pcount( ) = 2
- CMDNO := QBCHOICE()
- endif
- MCHR := ""
-
- NCMDS := CHRCOUNT( "|", CMDS )
- COLNO := centre( CMDS + space(NCMDS ), 79 )
-
- clear typeahead
- do QBCLMESS
- set color to( COLMENU() )
- for I := 1 to NCMDS
- N2 := ATNEXT( "|", CMDS, I )
-
- @ QBMSGLIN() , COLNO prompt substr( CMDS, N1, N2 - N1 )message MSG
- MCHR := MCHR + substr( CMDS, N1, 1 )
- COLNO := col( ) + 2
- N1 := N2 + 1
- next
- menu to CMDNO
- QBKEY( lastkey( ) )
- if CMDNO = 0
- GETOUT( .t. )
- QBCHOICE( 0 )
- QBRESP( "Q" )
- QBKEY( 27 )
- else
- QBRESP( substr( MCHR, CMDNO, 1 ) )
- QBCHOICE( CMDNO )
- GETOUT( .f. )
- endif
- do QBCLMESS
-
- return CMDNO
-
- //*****************************************************************
-
- procedure QBBOX( WIDTH ) // Amended by SUMMER93
- // Calls:
- // Called By: BODINDEX QBINIT HOUSEMAIN REPARAM BODYWORK
-
- // Q B B O X
- local ULINK, DLINK, RCOL, LCOL
-
-
- LCOL := ( 79 - WIDTH ) / 2
- RCOL := 79 - LCOL
- DLINK := chr( 209 )
- ULINK := chr( 207 )
- @ 3, LCOL say DLINK
- @ 3, RCOL say DLINK
- @ 4, LCOL to 20, LCOL
- @ 4, RCOL to 20, RCOL
- @ 21, LCOL say ULINK
- @ 21, RCOL say ULINK
-
- return
-
- //*****************************************************************
-
- procedure QBLAYOUT( HEADING ) // Amended by SUMMER93
- // Calls:
- // Called By: BODINDEX QBINIT QBINDATE HOUSEMAIN REPARAM BODYWORK
-
- // Q B L A Y O U T
-
- // layout general header routine
-
- clear screen
- // @ 1,0 to 1,79 double
- @ 21, 0 to 21, 79 double
- @ 23, 0 say QBTITLE()
- @ 23, 80 - len( QBDATE() )say QBDATE()
- @ 3, 0 to 3, 79 double
- set color to( COLHEAD() )
- @ 22, centre( trim(HEADING ), 79 )say trim( HEADING )
- set color to( COLNORM() )
-
- return
-
- //*****************************************************************
-
- procedure QBREAD( MSG, MSG2, GETLIST ) // Amended by SUMMER93
- // Calls: QBCLMESS
- // Called By: INVADD INVREN QB2DATES PARTGET PGETSPEC REPARAM INVGET INVVEH INVPAY INVINSLB GINVNO CTUPDATE
- // Q B R E A D
- // Routine to check whether a bunch of fields have been modified
- local MPOS, MESS
-
- MESS := trim( MSG ) + " - Hit Esc to Abort"
- if pcount( )< 2
- MSG2 := "Move: , End: ┘ (field), PgDn (screen)"
- endif
- do QBCLMESS
- set color to( COLBRIGHT() )
-
- @ QBMSGLIN() , centre( trim(MESS ), 79 )say trim( MESS )
- if !empty( MSG2 )
- @ QBMSGLIN() + 1, centre( trim(MSG2 ), 79 )say trim( MSG2 )
- endif
-
- set color to( COLNORM() )
- read
- GETOUT( ( lastkey() = 27 ) )
- CHANGED( updated( ) )
- do QBCLMESS
-
- return
-
- //*****************************************************************
-
- procedure QBPUTL( LSKIP, LINE ) // Amended by SUMMER93
- // Calls: QBYESNO
- // Called By: REPLIST REPREV REPWIP
-
- // Q B P U T L
- // Used to output print lines and control page throws
- // The following locals have been declared by Summer'93
- // EXEC
- local LCOUNT, PVAR, EXEC
-
- LCOUNT := 1
-
- if GETOUT()
- return
- endif
- // Public variable references (defined amd released in QBPRCTL):
-
- // PAGENO => current page number
- // PLENGTH => no lines to page
- // PLINE => current line no
- // PHEAD1...PHEADn => header text lines for each page
- // PHEADn that are missing become line feeds
- // PHEAD => no header lines
- // PDEST => Screen, Printer, File
- // PFOOT1...PFOOTn => footer text lines for each page
- // PFOOT => no footer lines
- if LINE = "PLENGTH"
- PLENGTH( LSKIP )
- return
- endif
- if LINE = "PWIDTH"
- PWIDTH( LSKIP )
- return
- endif
- if LINE = "EJECT"
- PLINE( PLENGTH() + 1 )
- LINE := ""
- endif
-
- // End of Page
-
- if( PLINE() + LSKIP )> PLENGTH()
-
- if !PSTART
- for LCOUNT := 1 to PFOOT
- PVAR := "PFOOT" + str( LCOUNT, 1 )
- if type( PVAR )<> "C" // Did we define it?
- ?
- else
- EXEC := &PVAR
- ?&EXEC // Execute Macro for footer
- endif
- next
- LCOUNT := 1
- do case
- case PDEST = "S"
- if QBYESNO( "Continue listing? (Y/N)" ) = "N"
- GETOUT( .t. )
- return
- endif
- clear screen
- @ 3, 0 say ""
- case PDEST = "P"
- eject
- endcase
- else
- if PDEST = "S"
- clear screen
- @ 3, 0 say ""
- endif
- PLENGTH( PLENGTH() - ( PHEAD + PFOOT ) )
- PSTART := .f.
- endif
-
- do while LCOUNT <= PHEAD
- PVAR := "PHEAD" + str( LCOUNT, 1 )
- if type( PVAR )<> "C" // Did we define it?
- ?
- else
- if len( &PVAR )< PWIDTH() - 9 .and. LCOUNT = 1
- ?&PVAR + space( PWIDTH() - 10 - len(PHEAD1() )) + "Page" + ;
- str( PAGENO, 4 )
- else
- ?&PVAR
- endif
- endif
- LCOUNT := LCOUNT + 1
- enddo
- PAGENO := PAGENO + 1
- PLINE( 0 )
- LCOUNT := 1
-
- endif
-
- for LCOUNT := 1 to LSKIP
- ?
- next
-
- PLINE( PLINE() + LSKIP )
-
- if len( LINE )> PWIDTH()
- LINE := substr( LINE, 1, PWIDTH() )
- endif
-
- ?? LINE
-
- return
-
- //*****************************************************************
-
- procedure QBPUTH( HEADNO, HLINE ) // Amended by SUMMER93
- // Calls:
- // Called By: REPLIST REPREV REPWIP
-
- // Q B P U T H
- // Used to define page headings
- local PVAR
-
-
- // Public variable references:
-
- // PAGENO => current page number
- // PLENGTH => no lines to page
- // PLINE => current line no
- // PHEAD1...PHEADn => header text lines for each page
- // PHEAD => no header lines
- // PDEST => Screen, Printer, File
-
- PVAR := "PHEAD" + str( HEADNO, 1 )
- &PVAR := HLINE
-
- PHEAD := max( PHEAD + 1, HEADNO )
-
- return
-
- //*****************************************************************
-
- procedure QBPUTF( FOOTNO, FLINE ) // Amended by SUMMER93
- // Calls:
- // Called By:
-
- // Q B P U T F
- // Used to define page and grand totals
- local PVAR
-
-
- // Public variable references:
-
- // PAGENO => current page number
- // PLENGTH => no lines to page
- // PLINE => current line no
- // PHEAD1...PHEADn => header text lines for each page
- // PHEAD => no header lines
- // PDEST => Screen, Printer, File
- // PFOOT1...PFOOTn => footer text lines for each page
- // PFOOT => np footer lines
-
- PVAR := "PFOOT" + str( FOOTNO, 1 )
- &PVAR := FLINE
-
- PFOOT := FOOTNO
-
- return
-
- //*****************************************************************
-
- procedure QBWIPE
- // Calls:
- // Called By: INVDEL PARTDEL BODARCH
-
- // QBWIPE
- // Wipe out all the fields in a record
- // The following locals have been declared by Summer'93
- // DUMMY N I NULVAR CURFLD
- local FNAME, FTYPE, FWIDTH, DUMMY, N, I, NULVAR, CURFLD
- DUMMY := ""
- N := fcount( )
- FNAME := array( N )
- FTYPE := array( N )
- FWIDTH := array( N )
-
- afields( FNAME, FTYPE, FWIDTH, DUMMY )
-
- for I := 1 to N
-
- do case
- case FTYPE[ I ] $ "CM"
- NULVAR := " "
- case FTYPE[ I ] = "D"
- NULVAR := ctod( "" )
- case FTYPE[ I ] = "N"
- NULVAR := 0
- case FTYPE[ I ] = "L"
- NULVAR := .f.
- endcase
- CURFLD := FNAME[ I ]
- replace &CURFLD with NULVAR
- next
-
- return
-
- //*****************************************************************
-
- procedure QB2DATES( MESS, R1, C1, D1, R2, C2, D2 ) // Amended by SUMMER93
- // Calls: QBREAD QBMESS
- // Called By: BODARCH REPARAM
-
- // Q B 2 D A T E S
- // get two dates if one is blank set limits..
- local GETLIST
- GETLIST := {}
- if D1 = ctod( "01/1/87" )
- D1 := ctod( "" )
- endif
- if D2 = ctod( "31/12/99" )
- D2 := ctod( "" )
- endif
-
- do while .t.
- @ R1, C1 get D1 picture "@K"
- @ R2, C2 get D2 picture "@K"
- do QBREAD with MESS , , @GETLIST
- // Call amended
-
- if D2 = ctod( "" )
- D2 := ctod( "31/12/99" )
- endif
-
- do case
- case GETOUT()
- exit
- case D1 > D2
- do QBMESS with "First date is after Second", COLFLASH() , 3
- case D1 = ctod( "" )
- D1 := ctod( "01/01/87" )
- exit
- otherwise
- exit
- endcase
- enddo
-
- return
-
- //*****************************************************************
-
- function QBMENU( MENUNAME, WIDTH ) // Amended by SUMMER93
- // Calls: QBMESS
- // Called By: HOUSEMAIN BODYWORK
-
- // Q B M E N U . P R G
- // Procedure to get menu choice from user -
- // returns both keystroke and choice no.
- local SCOL, MROW, MAXLEN, LPOS, CPOS, NCHAR, m, I
- // These locals cover set/get variables where lvalues are needed
- local QBCHOICE
-
- SCOL := 5 + ( 79 - WIDTH ) / 2
- MROW := 8
- MAXLEN := 0
- I := 0
- LPOS := 1
- QBKEY( 0 )
- if QBCHOICE() = 0
- QBCHOICE( 1 )
- endif
-
- // SET exact off
- set message to 1 center
- // SELECT 9
- set color to( COLMENU() )
- use QBINFO index QBINFO
- set softseek on
- seek trim( MENUNAME )
- if !eof( )
- do while( substr(FIELD->qbinfkey , 1, 7 ) = MENUNAME ) .and.( !eof())
- I := I + 1
- @ MROW, SCOL prompt trim( FIELD->QBTEXT )message trim( ;
- FIELD->WHATITDOES )
- MROW := MROW + 1
- skip
- enddo
- endif
- if I = 0
- do QBMESS with "No valid menu choices available", COLFLASH() , 5
- QBKEY( 27 )
- QBCHOICE( 0 )
- use
- return 0
- else
- menu to QBCHOICE
- QBCHOICE(QBCHOICE)
- seek substr( MENUNAME, 1, 7 ) + str( QBCHOICE() , 1 )
- QBPROC( FIELD->QBTEXT )
- use
- endif
- if QBCHOICE() = 0
- QBKEY( 27 )
- endif
- set softseek off
-
- set color to( COLNORM() )
- // SET exact on
-
- return QBCHOICE()
-
- //*****************************************************************
-
- procedure QBPRCTL( CHOICE ) // Amended by SUMMER93
- // Calls: QBPROMPT QBMESS QBCLMESS
- // Called By: INVOUT REPARAM REPLIST REPREV REPWIP
-
- // Q B P R C T L
- // Control Printing
- // The following locals have been declared by Summer'93
- // FNAME ACTION
- local GETLIST, FNAME, ACTION
- GETLIST := {}
- FNAME := space( 8 )
- PAGENO := 1
- PHEAD := 0
- PFOOT := 0
- PSTART := .t.
-
- if GETOUT()
- close database
- return
- endif
-
- // If the choice is specified it just goes ahead and does it using the last part
- // of choice as the file name, if not you are asked which to use if it's a file
- // then you are prompted for the name.
-
- do case
- case len( trim(CHOICE )) = 0
- PDEST := " "
- set console on
- set alternate off
- CHOICE := substr( "SPFQ", QBPROMPT("Screen|Printer|File|Quit|", ;
- "Choose output destination", 1 ), 1 )
- if CHOICE = "Q"
- GETOUT( .t. )
- return
- endif
- case len( trim(CHOICE ))> 2
- FNAME := substr( CHOICE, 3, len(CHOICE ) - 2 )
- endcase
-
- CHOICE := substr( CHOICE, 1, 1 )
- if CHOICE $ "PSF"
- PDEST := CHOICE
- do case
- case CHOICE = "S"
- PLENGTH( 22 )
- PWIDTH( 79 )
- otherwise
- PLENGTH( 55 )
- PWIDTH( 132 )
- endcase
- PLINE( PLENGTH() + 1 )
- PHEAD := 0
- endif
-
- do case
- case CHOICE = "S"
- do QBMESS with "Preparing Report", COLFLASH() , 0
- case CHOICE = "P"
- do QBMESS with "Printing Report", COLFLASH() , 0
- do while !isprinter( )
- ACTION := QBPROMPT( "Continue|Quit|", ;
- "Printer is not ready - correct and continue or Quit", 1 )
- if ACTION = 2 .or. QBRESP() = "Q"
- GETOUT( .t. )
- return
- endif
- enddo
- set print on
- set console off
- ?TPSET1() // Begin print code
- case CHOICE = "F"
- if len( CHOICE )> 1
- FNAME := trim( substr(CHOICE, 3, len(CHOICE - 2 )))
- else
- do QBCLMESS
- @ QBMSGLIN() , 26 say "Enter file name: " get FNAME picture ;
- "NNNNNNNN"
- read
- endif
- if !"." $ FNAME
- FNAME := upper( trim(FNAME )) + ".TXT"
- endif
- do QBMESS with "Sending Report to file " + FNAME, COLFLASH() , 0
- set alternate to ( FNAME )
- set console off
- set alternate on
- case CHOICE = "R" // Reset
- set print off
- set console on
-
- PHEAD1( "" )
- PHEAD2( "" )
- PHEAD3( "" )
- PHEAD4( "" )
- PHEAD5( "" )
- PHEAD6( "" )
- PHEAD7( "" )
- PHEAD8( "" )
- PHEAD9( "" )
- do case
- case PDEST = "F"
- ?
- set alternate off
- close alternate
- case PDEST = "P"
- set console off
- eject
- set console on
- set print off
- case PDEST = "S"
- ?
- ?
- endcase
- do QBMESS with FNAME + " - Press a key", COLMENU() , - 1
- do QBCLMESS
- endcase
- TPSET1( PSET2() ) // reset to system defaults
- return
-
- //*****************************************************************
-
- procedure QBLSTSUN
- // Calls:
- // Called By: QBINDATE
- // Q B L S T S U N . P R G
- // Find the date last Sunday
-
- LSTSUN := date( ) - dow( date()) + 1
-
- return
-
- //*****************************************************************
-
- procedure QBGETD( MSG, default ) // Amended by SUMMER93
- // Calls: QBCLMESS
- // Called By: QBINDATE
- // Q B G E T D . P R G
- // get a date variable: qbrespd
-
- local MPOS, GETLIST
- // These locals cover set/get variables where lvalues are needed
- local QBRESPD
- GETLIST := {}
-
- MPOS := ( 79 - len(MSG )) / 2
- QBRESPD( ctod( default ) )
-
- set confirm on
- do QBCLMESS
- // GET command amended to ...
- QBRESPD := QBRESPD()
- @ QBMSGLIN() , MPOS say MSG get QBRESPD ;
- WHEN { || QBRESPD := QBRESPD(), .t. } valid { || ;
- QBRESPD( QBRESPD ) != NIL }
- read
- set confirm off
-
- return
-
- //*****************************************************************
-
- function QBYESNO( MSG ) // Amended by SUMMER93
- // Calls: QBCLMESS
- // Called By: BODINDEX INVDEL INVREN QBPUTL INVOUT PARTUPDAT BODARCH BODREST INVGET INVVEH INVPAY INVINSLB GINVNO CTSLCT CTUPDATE BODYWORK IVFUNC
- local RETVAL
-
-
- do QBCLMESS
- set color to( COLBRIGHT() )
- set cursor off
- @ QBMSGLIN() , centre( trim(MSG ), 79 )say trim( MSG )
-
- RETVAL := " "
- do while !RETVAL $ "YN"
- RETVAL := upper( chr(inkey()))
- enddo
- do QBCLMESS
- set cursor on
-
- return RETVAL
-
- //*****************************************************************
-
- function centre( CTEXT, WIDTH ) // Amended by SUMMER93
- // Calls:
- // Called By:
- // Returns column position for Centred heading
- // The following locals have been declared by Summer'93
- // COLPOS
- local COLPOS
-
- if pcount( ) = 1
- WIDTH := 80
- endif
-
- COLPOS := max( int((WIDTH - 1 - len(CTEXT )) / 2 ), 0 )
-
- return COLPOS
-
- //*****************************************************************
-
- procedure QBADBLNK( NRECS ) // Amended by SUMMER93
- // Calls: QBMESS
- // Called By: INVSAVE PARTSAVE
-
- // Q B A D B L N K . P R G
- // Routine to append blank records
- local I, ADSTR
-
-
- // i = recsize()*nrecs
- // IF i>diskspace()
- // adstr = "You have run out of disc space!!"
- // DO qbmess WITH adstr,colflash,0
- // WAIT
- // DO qbquit
- // ENDIF
-
- ADSTR := "Please wait - adding " + str( NRECS, 4 ) + " records"
-
- do QBMESS with ADSTR, COLFLASH() , 0
-
- I := 1
- do while I <= NRECS
- I := I + 1
- append blank
- enddo
- do QBMESS with " ", COLNORM() , 0
-
- return
-
- //*****************************************************************
- function SEEKIT( CTEXT ) // Amended by SUMMER93
- // Calls:
- // Called By:
- seek CTEXT
- return( !eof())
-
- //******************************************************************
- function blank( XVALUE ) // Amended by SUMMER93
- // Calls:
- // Called By:
- local XRETURN
-
-
- do case
- case valtype( xValue ) == "C"
- XRETURN := space( len(XVALUE ))
- case valtype( xValue ) == "N"
- XRETURN := 0
- case valtype( xValue ) == "L"
- XRETURN := .f.
- case valtype( xValue ) == "D"
- XRETURN := ctod( "" )
- endcase
-
- return XRETURN
-
- //******************************************************************
- function CHRCOUNT( CCHAR, CSTRING ) // Amended by SUMMER93
- // Calls:
- // Called By: QBPROMPT
- local IRETURN, I
-
- IRETURN := 0
-
- for I := 1 to len( CSTRING )
- if substr( CSTRING, I, 1 )== CCHAR
- IRETURN := IRETURN + 1
- endif
- next
-
- return IRETURN
-
- //******************************************************************
- function CEILING( NVALUE ) // Amended by SUMMER93
- // Calls:
- // Called By: INVOUT
- local IRETURN, I
-
- IRETURN := 0
-
- IRETURN := int( NVALUE + 0.999 )
-
- return IRETURN
-
- //******************************************************************
- function ISDRIVE( CDRIVE ) // Amended by SUMMER93
- // Calls:
- // Called By: DRIVEOK
-
- return .t.
-
- //******************************************************************
- function ATNEXT( CCHAR, CSTRING, NOCC ) // Amended by SUMMER93
- // Calls:
- // Called By: QBPROMPT QBTXTMAC
- local IRETURN, I, ICOUNT
-
- IRETURN := ICOUNT := 0
-
- begin sequence
- for I := 1 to len( CSTRING )
- if substr( CSTRING, I, 1 )== CCHAR
- IRETURN := I
- ICOUNT := ICOUNT + 1
- if ICOUNT >= NOCC
- break
- endif // if iCount >= nOcc
- endif // if substr( cString, i, 1 ) == cChar
- next
- IRETURN := 0
- end
- return IRETURN
-
- //******************************************************************
- function center( CSTRING, NWIDTH ) // Amended by SUMMER93
- // Calls:
- // Called By:
- local ILEN, CRETURN
-
-
- if valtype( nWidth ) <> "N"
- NWIDTH := 80
- endif // if type( "nWidth" ) <> "N"
- ILEN := int( (NWIDTH - len(alltrim(CSTRING ))) / 2 )
-
- if ILEN < 0
- CRETURN := substr( CSTRING, 1, NWIDTH )
- else
- CRETURN := space( ILEN ) + alltrim( CSTRING )
- endif // if iLen < 0
-
- return CRETURN
-
- FUNCTION PDEST( xNewVal )
- local xReturn := PDEST
- if xNewVal <> NIL
- PDEST := xNewVal
- endif
- return xReturn
- // End of file
-